跳到主要内容

视图,view

视图,是一张表,但是虚拟表!

是通过一条查询语句得到一个张虚拟表!

因此,认为视图,就是 select语句的结果!

语法:

create view 视图名字 AS 查询语句

创建完成后,就可以在视图内,完成查询工作了:

作用
--

可见,使用视图的功能之一,就是简化查询的业务逻辑!

注意:视图内是不保存真实数据的!视图内,只有一条形成视图的 select 语句而已!

因此,每次从视图查询时,都需要利用视图,再在真实的表内将数据查询到!

类似一个 from型子查询!

功能之二:隐藏真实的表结构!

从而取得更大的兼容性

总结作用:1,简化逻辑,2,因此真实的结构(兼容性,限制用户的处理)

视图算法,执行方式
---------

场景

取得每个班级最高的学生信息

使用 from型子查询,可以,但是使用同样逻辑的视图不行!

视图:

视图其实一共有三种执行方式:

merge,合并

temptable,临时表

undefined,未定义,就是默认的,mysql自己决定算法(从 merge,和temptable内选择)!

典型的都是选择的merge的:因此上面的视图查询:

如何解决?

可以选择决定视图的算法!在创建视图时,指定。

ALGORITHM=temptable即可

algorithm

用到比较少!

事务,transaction
==============

一组 SQL 的集合,要不集体都执行成功,要不集体都失败,指的是,应该生成的影响退回到改组sql执行之前!

往往一个业务逻辑,是由多条语句组合完成!

语法
--

开启事务:start transaction可以简写成[begin]

记录下来,之后所执行的sql!(操作与结果)

提交:commit

如果所有的sql都执行成功,则提交。将sql的执行结果持久化到数据表内!

回滚:rollback

如果存在失败的sql,则需要回滚。将sql的执行结果,退回到事务开始之前

无论回滚还是提交,都会关闭该事务!(需要再次开启,才能使用)

事务,只针对当前的连接生效!

测试:

使用第一个链接A,开启事务后,执行一条update语句:

结果成功,数据已经变成修改之后!

此时没有提交通过其他连接B,查看,数据,是没有更改!

如果此时选择连接A 提交:

commit

在其他的连接B,查看时,数据也发生了变化:

回滚:

一旦回滚,则事务内的所有的sql影响都会被撤销!

rollback

事务的基本原理,autocommit
------------------

提交,就会将结果持久化,不提交不会!

如果不开启事务,执行一条sql,马上会持久化数据!

可见,普通的执行,是立即提交!

因为,默认的mysql对sql语句的执行是自动提交的!

开启事务其实就是,关闭了自动提交的功能!改成了commit执行手动提交!

因此,可以通过简单的对是否自动提交加以设置,可以完成开启事务的目的!

自动提交的特征是保存在服务的一个叫做autocommit的一个变量内的!

使用 set 变量名=变量值的形式就可以完成修改:

此时提交:

此时的回滚或者提交,不会关闭事务!需要手动设置为开启!

注意:事务类似于外键约束,只被innodb引擎支持!

事务的特点,ACID
----------

原子性,一致性,隔离型,持久性

原子性:事务是不可分割的。

一致性:保证数据在事务的执行周期内,是一致的!

隔离型:多个事务之间的干扰关系!隔离级别!

持久性:事务一旦被提交,就不可能在被回滚!

![](4D03E245F001ABFEDF19E06655DD213E.png)

上一篇: 23 数据的备份